package com.sinovatech.ologger.actionlog.aop.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target( { ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
public @interface OperationLogAnnotation {

	public static final String CREATOR_NEW = "new";
	public static final String CREATOR_SPRING = "spring";
	
	/**
	 * 创建器 处理数据的类.可以new创建也可以spring容器管理.默认为new
	 */
	String creator() default CREATOR_NEW;

	/**
	 * 如果为new创建就是类全明名,spring创建则为配置id/name
	 */
	String beanName() default "";

	/**
	 * 执行的方法名称 方法的格式
	 * 默认为当前拦截的方法名
	 * <code>public Integer doLogger(Object returnValue, Method method, Object[] args, Object target, OperationLog operationLog, ApplicationContext context)</code>
	 * @see com.sinovatech.ologger.actionlog.core.OperationLogger.doLogger()
	 */
	String methodName() default "";

	/**
	 * 操作名称 如"新增员工"、"日报汇算"、"删除请假单"
	 */
	String operationName() default "";

	/**
	 * 操作详细信息/条件
	 */
	String operationDetails() default "";

	/**
	 * 是否将拦截方法的参数以JSON方式保存
	 */
	boolean isRecordArgsForJSON() default true;

	/**
	 * 是否开启记录日志的开关 默认开
	 * 关闭日志时,不要取消该注释,只需关闭此开关即可 因为过往的日志输出时还依赖该注释
	 */
	boolean doLog() default true;

	/**
	 * 是否需要在目标方法执行前运行
	 * 一般删除方法需要开启该设置,因为方法执行完删除以后,可能就不能拿到需要的数据了
	 * 判断是方法执行前还是执行后可通过方法参数OperationLogInvocation中的isExecuted进行判断
	 * 默认 false
	 */
	boolean needBeforeRun() default false;

	/**
	 * 检查是否需要记录日志的返回值表达式
	 * 结果为Boolean值 如 returnValue == 1
	 * 只在没有处理方法(包括默认的处理方法)时在有效,如果为空则会调用默认的返回值检查
	 */
	String checkReturnExpression() default "";

}
